package JackSu.java01;

import org.junit.Test;

import java.util.Arrays;
import java.util.Objects;

public class JavaExtends extends JavaExtendsFather {

    public boolean test(){
        return false;
    }

    //检查对象及域是否相等，覆盖Object类equals方法
    @Override
    public boolean equals(Object otherObject){

        if(this==otherObject){//检查是否是同一个对象
            return true;
        }
        if(otherObject==null){
            return false;
        }
        if(!(getClass()==otherObject.getClass())){//检查是否属于同一个类
            return false;
        }
        if(!(otherObject instanceof JavaExtends)){//检查是否有同一的语义（也就是同一个父类下并且没有扩展属性或方法）
            return false;
        }

        return test()==((JavaExtends) otherObject).test();
    }

    @Test
    public void hashCodeTest(){
        String s= "Hello";
        StringBuilder b1 = new StringBuilder(s);
        System.out.println(s.hashCode()+"------"+b1.hashCode());
        String s2= "Hello";
        StringBuilder b2 = new StringBuilder(s2);
        System.out.println(s2.hashCode()+"------"+b2.hashCode());
        //字符串的散列码由内容导出；StringBuilder没有定义hashCode方法，其散列码由Object默认hashCode导出的对象存储地址
        //重新定义equals方法就必须重新定义hashCode方法。equals比较的两个对象相等，那么其hashCode也必定相等
        int i = Double.hashCode(1.1);//静态方法避免创建Double对象
        System.out.println(Objects.hash("zhangsna",1.1D,'a'));//重写的时候可以组合各域散列值，对各个参数调用Object.hash方法，汇集成一个hashCode
        int j = Objects.hashCode(1);//参数为空则返回0
        System.out.println(Arrays.hashCode(new int[]{1,2,34}));
    }

    public static void main(String[] args) {
        JavaExtends javaExtends = new JavaExtends();
        boolean equals = javaExtends.equals(new JavaExtendsFather());
        System.out.println(equals);

        System.out.println(Arrays.equals(new int[]{1,2,3,4,5,6},new int[]{1,2,3,4,5,6}));
        System.out.println(Objects.equals(null,null));//如果两个都为null则返回true

    }
}
